package logic

import (
	"bluebell/dao/mysql"
	"bluebell/models"
	"bluebell/pkg/snowflake"
	"time"

	"go.uber.org/zap"
)

// ToggleCollectPost 切换帖子收藏状态
func ToggleCollectPost(userID, postID int64) (bool, error) {
	// 1. 验证帖子是否存在
	if exists, err := mysql.PostExists(postID); err != nil {
		zap.L().Error("ToggleCollectPost: 查询帖子是否存在失败",
			zap.Int64("postID", postID),
			zap.Error(err))
		return false, err
	} else if !exists {
		zap.L().Warn("尝试切换收藏状态的不存在的帖子",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID))
		return false, models.CodePostNotExist
	}

	// 2. 检查当前收藏状态
	isCollected, err := mysql.IsPostCollected(userID, postID)
	if err != nil {
		zap.L().Error("ToggleCollectPost: 检查收藏状态失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		return false, err
	}

	// 3. 根据当前状态执行收藏或取消收藏
	if isCollected {
		// 已收藏，执行取消收藏
		if err := mysql.DeleteCollect(userID, postID); err != nil {
			zap.L().Error("ToggleCollectPost: 删除收藏记录失败",
				zap.Int64("userID", userID),
				zap.Int64("postID", postID),
				zap.Error(err))
			return false, err
		}
		zap.L().Info("用户成功取消收藏",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID))
		return false, nil // 返回新的状态：未收藏
	}

	// 未收藏，执行收藏
	collect := &models.UserCollect{
		ID:        snowflake.GenID(),
		UserID:    userID,
		PostID:    postID,
		CreatedAt: time.Now(),
	}
	if err := mysql.CreateCollect(collect); err != nil {
		zap.L().Error("ToggleCollectPost: 创建收藏记录失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		return false, err
	}

	// 更新帖子收藏计数
	if err := mysql.IncrementCollectCount(postID); err != nil {
		zap.L().Error("ToggleCollectPost: 增加帖子收藏计数失败",
			zap.Int64("postID", postID),
			zap.Error(err))
		// 即使计数更新失败，也不影响收藏操作
	}

	zap.L().Info("用户成功收藏帖子",
		zap.Int64("userID", userID),
		zap.Int64("postID", postID))
	return true, nil // 返回新的状态：已收藏
}

// GetCollectStatus 获取帖子收藏状态
func GetCollectStatus(userID, postID int64) (bool, error) {
	isCollected, err := mysql.IsPostCollected(userID, postID)
	if err != nil {
		zap.L().Error("GetCollectStatus: 查询收藏状态失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		return false, err
	}
	return isCollected, nil
}

// CollectPost 收藏帖子
func CollectPost(userID, postID int64) error { // 返回 error 接口
	// 1. 验证帖子是否存在
	if exists, err := mysql.PostExists(postID); err != nil {
		zap.L().Error("查询帖子是否存在失败",
			zap.Int64("postID", postID),
			zap.Error(err))
		return err
	} else if !exists {
		zap.L().Warn("尝试收藏不存在的帖子",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID))
		return models.CodePostNotExist // 使用 models.CodePostNotExist
	}

	// 2. 检查是否已收藏
	if isCollected, err := mysql.IsPostCollected(userID, postID); err != nil {
		zap.L().Error("检查收藏状态失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		return err
	} else if isCollected {
		zap.L().Info("用户重复收藏",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID))
		// 这是一个业务逻辑错误，直接返回你的业务错误码
		return models.CodeAlreadyCollected // 使用 models.CodeAlreadyCollected
	}

	// 3. 创建收藏记录
	collect := &models.UserCollect{
		ID:        snowflake.GenID(),
		UserID:    userID,
		PostID:    postID,
		CreatedAt: time.Now(),
	}

	if err := mysql.CreateCollect(collect); err != nil {
		zap.L().Error("创建收藏记录失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		return err
	}

	// 4. 更新帖子的收藏计数
	if err := mysql.IncrementCollectCount(postID); err != nil {
		zap.L().Error("增加帖子收藏计数失败",
			zap.Int64("postID", postID),
			zap.Error(err))
		// 即使计数更新失败，也不影响收藏操作
	}

	zap.L().Info("用户成功收藏帖子",
		zap.Int64("userID", userID),
		zap.Int64("postID", postID))

	return nil
}

// UncollectPost 取消收藏
func UncollectPost(userID, postID int64) error { // 返回 error 接口
	// 1. 验证是否已收藏
	if isCollected, err := mysql.IsPostCollected(userID, postID); err != nil {
		zap.L().Error("检查收藏状态失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		return err
	} else if !isCollected {
		zap.L().Info("用户尝试取消未收藏的帖子",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID))
		// 这是一个业务逻辑错误，直接返回你的业务错误码
		return models.CodeNotCollected // 使用 models.CodeNotCollected
	}

	// 2. 删除收藏记录
	if err := mysql.DeleteCollect(userID, postID); err != nil {
		zap.L().Error("删除收藏记录失败",
			zap.Int64("userID", userID),
			zap.Int64("postID", postID),
			zap.Error(err))
		return err
	}

	zap.L().Info("用户成功取消收藏",
		zap.Int64("userID", userID),
		zap.Int64("postID", postID))

	return nil
}

// GetCollectList 获取收藏列表（精简版）
func GetCollectList(userID int64, page, size int64) ([]*models.CollectListItem, error) {
	// 确保分页参数合理
	if page < 1 {
		page = 1
	}
	if size < 1 || size > 100 {
		size = 10 // 默认每页10条
	}

	posts, err := mysql.GetCollectList(userID, page, size)
	if err != nil {
		zap.L().Error("获取收藏列表失败",
			zap.Int64("userID", userID),
			zap.Int64("page", page),
			zap.Int64("size", size),
			zap.Error(err))
		return nil, err
	}

	zap.L().Info("用户获取收藏列表",
		zap.Int64("userID", userID),
		zap.Int("count", len(posts)))

	return posts, nil
}
